package com.fh.zs.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.http.HttpStatus;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * @FileName : IllegalIpFilter
 * @Description : 非法ip过滤功能
 * @Author : fh
 * @Date : 2020/11/20 10:31
 * @Version : 1.0.0
 */
@Component
public class IllegalIpFilter extends ZuulFilter {

    /**
     * 获取配置文件中配置的属性值，赋值给当前属性
     */
    @Value("${illegalIp}")
    private String illegalIps;

    /**
     * 定义过滤器的类型（过滤器执行的时机）
     *
     * @return
     */
    @Override
    public String filterType() {
        /**
         * pre 在执行业务之前执行
         * route 在执行业务时执行
         * post 在执行业务后执行
         * error 在执行业务发生异常时执行
         */
        return "pre";
    }

    /**
     * 执行顺序（当有多个过滤器时，返回值越小，执行优先级越高）
     *
     * @return
     */
    @Override
    public int filterOrder() {
        //0  10 0先执行 10后执行
        return 0;
    }

    /**
     * 确定该过滤器是否启用
     *
     * @return
     */
    @Override
    public boolean shouldFilter() {
        //返回false则不启用该过滤器  true则启用
        return true;
    }

    /**
     * 过滤器执行的业务
     *
     * @return
     * @throws ZuulException
     */
    @Override
    public Object run() throws ZuulException {
        System.out.println("进入非法IP过滤器...");
        //使用zuul组件中RequestContext提供的获取上下文对象方法得到上下文对象
        RequestContext currentContext = RequestContext.getCurrentContext();
        //获取HttpServletRequest
        HttpServletRequest request = currentContext.getRequest();
        //获取HttpServletResponse
        HttpServletResponse response = currentContext.getResponse();
        //获取请求的IP地址
        String ipAddr = request.getRemoteAddr();
        System.out.println("访问的ip：" + ipAddr);
        //判断ip地址是否合法
//        if (ipAddr.equals("192.168.31.209") || ipAddr.equals("192.168.31.117") ||
//                ipAddr.equals("192.168.31.104") || ipAddr.equals("192.168.31.82"))
        if (illegalIps.contains(ipAddr)) {
            //程序不再继续
            currentContext.setSendZuulResponse(false);
            //防止响应中断
            response.setCharacterEncoding("utf-8");
            try {
                response.sendError(HttpStatus.SC_FORBIDDEN, "你的IP被禁止访问！！！");
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return null;
    }
}
